package org.example.n21;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * @author zhaokuii11@163.com
 * @create 2021-12-06 9:54
 * @Description
 */
public class Test1 {
    private SessionFactory sessionFactory;//会话工厂
    private Session session;//会话
    private Transaction transaction;//事务

    @Before //juint测试方法 之前执行
    public void init() {
        System.out.println("init");
        //1. 根据 Configuration创建 会话工厂
        sessionFactory = new Configuration().configure().buildSessionFactory();
        //2. 创建 会话
        session = sessionFactory.openSession();
        //3. 创建事务
        transaction = session.beginTransaction();
    }







    @After//juint测试方法 之后执行
    public void destroy() {
        //先开后关
        System.out.println("destroy");
        transaction.commit();
        session.close();
        sessionFactory.close();
    }

    @Test
    public void testDelete() {
        //在不设定级联关系的情况下，且1这一端的对象有n对象在引用，不能直接删除1这一端的对象
        Customer customer = session.get(Customer.class, 1);
        session.delete(customer);
    }

    @Test
    public void testUpdate() {
        //此时更改了数据库中的数据
        Order order = session.get(Order.class, 2);
        order.getCustomer().setCustomerName("aaa");
    }

    @Test
    public void testMany20neGet() {
        //1. 若查询多的一端的一个对象，则默认情况下，子查询多的一端的对象，而没有查询关联1的那一端。
        Order order = session.get(Order.class, 2);
        System.out.println(order.getOrderName());
        System.out.println(order.getCustomer().getClass().getName());
        //session.close();
        //2. 在需要使用到关联的对象时，才发送对应的 sql语句
        System.out.println(order.getCustomer().getCustomerName());
        //3. 在查询 Customer 对象时，由多的一端导航1的一端时，
        // 若此时 session关闭，默认情况下可能会发生 LazyInitializationException
        //4. 获取 Order对象时，默认情况下，其关联关系的 Customer对象是一个代理对象。

    }

    @Test
    public void testMany20ne() {
        //创建表
        Customer customer = new Customer(null, "bb");
        //创建表并设定关联关系
        Order order1 = new Order(null, "order-3", customer);
        Order order2 = new Order(null, "order-4", customer);
        //执行 save操作 先执行没有外键的表【先插入1的一端，再插入n的一端】只有 insert
//        session.save(customer);
//        session.save(order1);
//        session.save(order2);

        //先插入 n的一段在执行1的一段，3条insert 2条update
        //因为：在插入多的一端时，无法确定1的一端的外键值，所以，只能等1的一端插入后，再额外发送 update语句
        //推荐插入1的一端，再插入多的一端
        session.save(order1);
        session.save(order2);
        session.save(customer);
    }

}
